package com.example.xposedtest.utils;

import android.util.Log;

import java.util.ArrayList;
import java.util.List;

import de.robv.android.xposed.XposedHelpers;

/**
 * 微信内部类扫描工具：通过特征字段定位MsgInfo和MsgInfoStorage
 *
 */
public class WeChatClassScanner {
    private static final String TAG = "WeChatClassScanner";
    private static final String WECHAT_PACKAGE = "com.tencent.mm"; // 微信固定包名

    /**
     * 扫描微信进程中的MsgInfo类（消息实体类，含field_content字段）
     * @param classLoader 微信的类加载器（TinkerClassLoader）
     * @return 类名（如"com.tencent.mm.storage.bi"），失败返回null
     */
    public static String scanMsgInfoClass(ClassLoader classLoader) {
        try {
            // 遍历微信包下的所有类（简化版：实际需结合包名过滤）
            List<Class<?>> allClasses = getAllClassesInPackage(classLoader, WECHAT_PACKAGE);
            for (Class<?> clazz : allClasses) {
                // 特征：包含field_content字段（微信长期保留的混淆字段）
                if (XposedHelpers.findFieldIfExists(clazz, "field_content") != null) {
                    Log.d(TAG, "找到MsgInfo类：" + clazz.getName());
                    return clazz.getName();
                }
            }
            Log.e(TAG, "未找到MsgInfo类（无field_content字段）");
            return null;
        } catch (Exception e) {
            Log.e(TAG, "扫描MsgInfo类异常", e);
            return null;
        }
    }

    /**
     * 扫描微信进程中的MsgInfoStorage类（消息存储类，含插入消息方法）
     * @param classLoader 微信的类加载器
     * @return 类名（如"com.tencent.mm.storage.bj"），失败返回null
     */
    public static String scanMsgInfoStorageClass(ClassLoader classLoader) {
        try {
            List<Class<?>> allClasses = getAllClassesInPackage(classLoader, WECHAT_PACKAGE);
            for (Class<?> clazz : allClasses) {
                // 特征：包含插入消息的方法（参数含ContentValues或MsgInfo）
                if (XposedHelpers.findMethodExactIfExists(clazz, "insert", String.class, String.class, android.content.ContentValues.class, Integer.TYPE) != null) {
                    Log.d(TAG, "找到MsgInfoStorage类：" + clazz.getName());
                    return clazz.getName();
                }
            }
            Log.e(TAG, "未找到MsgInfoStorage类（无插入方法）");
            return null;
        } catch (Exception e) {
            Log.e(TAG, "扫描MsgInfoStorage类异常", e);
            return null;
        }
    }

    /**
     * 遍历指定包下的所有类（简化实现，实际需结合DexFile遍历）
     * 注意：此方法为示例，实际场景中需通过DexFile API精确遍历
     */
    private static List<Class<?>> getAllClassesInPackage(ClassLoader classLoader, String packageName) {
        List<Class<?>> classes = new ArrayList<>();
        // 实际场景中需通过DexFile读取APK中的类，此处为简化示例
        // 可参考：https://github.com/rovo89/XposedBridge/blob/art/src/main/java/de/robv/android/xposed/XposedHelpers.java#L1000
        try {
            // 模拟遍历（实际需替换为真实DexFile逻辑）
            classes.add(XposedHelpers.findClass("com.tencent.mm.storage.bj", classLoader)); // 示例类名
            classes.add(XposedHelpers.findClass("com.tencent.mm.storage.bi", classLoader)); // 示例类名
        } catch (Throwable t) {
            Log.w(TAG, "遍历类失败", t);
        }
        return classes;
    }
}